//
// Created by admin on 2020/7/17.
//

#include "demo.h"

/*
 * 分配数组空间，将队头与队尾初始化为0；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
SqQueue InitQueue(){
    SqQueue sqQueue;
    sqQueue.base = (int *)malloc(sizeof(int) * MAXQSIZE);
    if (!sqQueue.base){
        exit(0);
    } else{
        sqQueue.head = sqQueue.tail = 0;
        return sqQueue;
    }
}

/*
 * 将数组释放，队列数组指针指向空；
 * 将队头等于队尾，置为0；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
void DestroyQueue(SqQueue *S){
    free((*S).base);
    (*S).base = NULL;
    (*S).head = (*S).tail = 0;
}

/*
 * 将队头等于队尾，置为0；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
void ClearQueue(SqQueue *S){
    (*S).head = (*S).tail = 0;
}

/*
 * 将队尾减去队头加上总容量，然后对总容量取余运算，得到长度；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
int QueueLength(SqQueue S){
    return (S.tail - S.head + MAXQSIZE)%MAXQSIZE;
}

/*
 * 当队尾加一对总容量取余不等于队头时，意味着队没满，入队；
 * 队尾等于队尾加一对总容量取余；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
int EnQueue(SqQueue *S,int data){
    if ((*S).base == NULL){
        printf("Queue Is Destroyed!");
        return 0;
    }else if (((*S).tail + 1) % MAXQSIZE != (*S).head){
        *((*S).base+(*S).tail) = data;
        (*S).tail = ((*S).tail + 1) % MAXQSIZE;
        return 1;
    } else{
        printf("Queue Is Full!");
        return 0;
    }
}

/*
 * 当队头不等于队尾时，意味着队不为空，出队；
 * 队头等于队头加一对总容量取余；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
int DeQueue(SqQueue *S){
    if ((*S).base == NULL){
        printf("Queue Is Destroyed!");
        return 0;
    }else if ((*S).head != (*S).tail){
        int data = *((*S).base+(*S).head);
        (*S).head = ((*S).head + 1) % MAXQSIZE;
        return data;
    } else{
        printf("Queue Is Empty!");
    }
}

/*
 * 当队头不等于队尾时，意味着队不为空，取队头元素；
 * 时间复杂度:O(1)
 * 空间复杂度:O(1)
 */
int GetHead(SqQueue S){
    if (S.head != S.tail){
        return *(S.base+S.head);
    } else{
        printf("Queue Is Empty!");
    }
}